/**
 * 数据导出组件
 * 提供多格式（Excel、CSV、Word）数据导出功能，支持灵活的导出选项配置
 * 基于Ant Design的Button和Dropdown组件构建，提供良好的用户交互体验
 */
import React, { useState } from 'react';
import { Button, Dropdown } from 'antd';
import { DownOutlined } from '@ant-design/icons';
import type { MenuProps } from 'antd';
import { transformInputsWithNamesAndUnits } from '../utils/parameterMappings';
import notificationService from '../../services/notificationService';
import errorHandlerService from '../../services/errorHandlerService';
import { safeInvoke } from '../utils/ipcUtils';

/**
 * 数据导出组件属性接口
 */
interface ExportDataProps {
  /** 站点名称，用作导出文件名前缀 */
  siteName?: string;
  /** 计算输入参数 */
  inputs?: Record<string, any>;
  /** 计算结果数据 */
  results?: Record<string, any>;
  /** 计算类型，用于参数映射转换 */
  calculationType?: string;
  /** 报告作者信息 */
  author?: string;
  /** 自定义子组件，用于按钮内容显示 */
  children?: React.ReactNode;
}

/**
 * 数据导出组件，支持导出CSV和Word格式
 */
const ExportData: React.FC<ExportDataProps> = ({
  siteName = '计算数据',
  inputs = {},
  results = {},
  calculationType = '',
  author = '',
  children
}) => {
  // 导出按钮加载状态
  const [loading, setLoading] = useState<boolean>(false);

  /**
   * 执行数据导出操作
   * @param type - 导出文件类型：excel、csv或word
   * @param exportContent - 导出内容范围：all（全部）、inputs（仅输入）或results（仅结果）
   * @param openFile - 导出后是否自动打开文件
   * @param suffix - 文件名后缀，通常是时间戳
   */
  const doExport = async (
    type: 'excel' | 'csv' | 'word',
    exportContent: 'all' | 'inputs' | 'results',
    openFile = false,
    suffix?: string
  ): Promise<void> => {
    try {
      setLoading(true);
      // 支持添加时间戳后缀
      const name = suffix ? `${siteName || '计算数据'}_${suffix}` : (siteName || '计算数据');
      
      // 转换输入参数为带中文名称和单位的对象
      const transformedInputs = transformInputsWithNamesAndUnits(inputs, calculationType);
      
      let resp;
      if (type === 'word') {
        // Word导出逻辑，统一使用safeInvoke进行IPC调用
        resp = await safeInvoke('perform-calculation', {
          calculationType: 'export-report-docx',
          params: {
            siteName: name,
            inputs: transformedInputs,
            results,
            author,
            exportType: exportContent
          }
        }, true);
        
        console.log('Word导出响应:', resp);
      } else {
        // Excel和CSV导出逻辑，使用统一的safeInvoke接口
        resp = await safeInvoke('perform-calculation', {
          calculationType: type === 'excel' ? 'export-report-excel' : 'export-report-csv',
          params: {
            siteName: name,
            inputs: transformedInputs,
            results,
            exportType: exportContent
          }
        }, true);
        
        console.log(`${type === 'excel' ? 'Excel' : 'CSV'}导出响应:`, resp);
      }

      if (resp && resp.success) {
        if (type === 'word') {
          notificationService.success(`Word报告导出成功：${resp.data}`);
          // 如果需要打开文件
          if (openFile && resp.data) {
            try {
              // 使用safeInvoke打开导出的文件
              await safeInvoke('open-file', { path: resp.data });
            } catch (err) {
              notificationService.warning('文件导出成功，但无法自动打开文件');
            }
          }
        } else if (type === 'excel') {
          notificationService.success(`Excel导出成功：${resp.data}`);
          // 如果需要打开文件
          if (openFile && resp.data) {
            try {
              await safeInvoke('open-file', { path: resp.data });
            } catch (err) {
              notificationService.warning('文件导出成功，但无法自动打开文件');
            }
          }
        } else {
          // CSV格式可能导出多个文件
          const filePaths = resp.data || [];
          if (Array.isArray(filePaths) && filePaths.length > 0) {
            notificationService.success(`CSV导出成功：${filePaths.map(f => f.path).join(', ')}`);
            // 如果需要打开文件，打开第一个文件
            if (openFile && filePaths.length > 0) {
              try {
                await safeInvoke('open-file', { path: filePaths[0].path });
              } catch (err) {
                notificationService.warning('文件导出成功，但无法自动打开文件');
              }
            }
          } else {
            notificationService.success('CSV导出成功');
          }
        }
      } else {
        console.error(`${type === 'word' ? 'Word' : type === 'excel' ? 'Excel' : 'CSV'}导出失败:`, resp);
        errorHandlerService.handleFileError(
          new Error(resp?.error || '导出失败'),
          type === 'word' ? 'Word导出' : type === 'excel' ? 'Excel导出' : 'CSV导出'
        );
      }
    } catch (err: any) {
      console.error('导出过程中出错:', err);
      errorHandlerService.handleFileError(
        err,
        '文件导出',
        '导出过程中出错'
      );
    } finally {
      setLoading(false);
    }
  };

  // 合并的导出菜单选项
  const menuItems: MenuProps['items'] = [
    {
      label: '导出Word报告',
      key: 'word-timestamp',
      onClick: () => doExport('word', 'all', false, new Date().toISOString())
    },
    {
      label: '导出Word报告并打开',
      key: 'word-timestamp-open',
      onClick: () => doExport('word', 'all', true, new Date().toISOString())
    },
    {
      type: 'divider',
      key: 'format-divider'
    },
    {
      label: 'Excel格式',
      key: 'excel',
      children: [
        {
          label: '导出全部数据',
          key: 'excel-all',
          onClick: () => doExport('excel', 'all', false)
        },
        {
          label: '仅导出输入参数',
          key: 'excel-inputs',
          onClick: () => doExport('excel', 'inputs', false)
        },
        {
          label: '仅导出计算结果',
          key: 'excel-results',
          onClick: () => doExport('excel', 'results', false)
        },
        {
          type: 'divider',
          key: 'excel-divider'
        },
        {
          label: '导出全部并打开',
          key: 'excel-all-open',
          onClick: () => doExport('excel', 'all', true)
        }
      ]
    },
    {
      label: 'CSV格式',
      key: 'csv',
      children: [
        {
          label: '导出全部数据',
          key: 'csv-all',
          onClick: () => doExport('csv', 'all', false)
        },
        {
          label: '仅导出输入参数',
          key: 'csv-inputs',
          onClick: () => doExport('csv', 'inputs', false)
        },
        {
          label: '仅导出计算结果',
          key: 'csv-results',
          onClick: () => doExport('csv', 'results', false)
        },
        {
          type: 'divider',
          key: 'csv-divider'
        },
        {
          label: '导出全部并打开',
          key: 'csv-all-open',
          onClick: () => doExport('csv', 'all', true)
        }
      ]
    }
  ];

  return (
    <Dropdown menu={{ items: menuItems }} trigger={['click']}>
      <Button
        loading={loading}
        type="primary"
        className="data-export-button"
      >
        {children ?? '导出数据'} <DownOutlined />
      </Button>
    </Dropdown>
  );
};

export default ExportData;